/**
 * 作者：
 * 创建时间：2012-6-30 下午1:52:58
 */
package dragon.model.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.json.simple.JSONObject;

import dragon.core.db.DML;
import dragon.core.exception.ExceptionHandler;
import dragon.core.util.Handler;
import dragon.core.util.StringUtils;
import dragon.model.fieldTemplate.FieldTemplate;
import dragon.model.fieldTemplate.FieldTemplateDao;
import dragon.model.fieldTemplate.FieldTemplateType;

/**
 * 实现功能：
 */
public class FieldTemplateHandler extends Handler {

	/**
	 * 加载字段模板数据
	 * 
	 * @throws ExceptionHandler
	 */
	@SuppressWarnings("unchecked")
	public String loadData() throws ExceptionHandler {

		// 参数
		Map<String, String> parameterMap = getParameterMap();

		FieldTemplate fieldTemplate = FieldTemplateDao.getFieldTemplate(parameterMap);
		if (fieldTemplate == null) {
			throw new ExceptionHandler("未发现字段模板：" + parameterMap);
		}

		List<Map<String, Object>> list = null;

		if (fieldTemplate.getType().equals(FieldTemplateType.SELECT)) {
			// Select，树形结构
			// 数据源同时定义 dicRoot 和 sql ，优先处理 sql(dicRoot 用于sql查询的参数)
			if (fieldTemplate.getSql() != null && !StringUtils.isEmpty(fieldTemplate.getSql())) {

				// TODO:catche
				list = new ArrayList<Map<String, Object>>();
				// 查询自定义SQL
				String id = getParameter("id");
				int pid = fieldTemplate.getDicRoot();
				if (id != null) {
					pid = Integer.parseInt(id);
				}
				List<Map<String, Object>> datas = DML.prepareQuery(fieldTemplate.getSql(), pid);
				Map<String, Object> option = null;
				Set<String> keys = null;
				Iterator<String> it = null;
				String key = null;
				Map<String, Object> attributes = null;
				for (Map<String, Object> map : datas) {
					attributes = null;

					option = new HashMap<String, Object>();
					option.put("id", map.get("ID"));// sql语句中必须提供id
					option.put("text", map.get("TEXT"));// sql语句中必须提供text
					option.put("state", map.get("STATE") != null ? map.get("STATE") : "closed");

					// attributes，sql语句中提供的其它字段
					if (keys == null) {
						keys = map.keySet();
						it = keys.iterator();
					}
					while (it.hasNext()) {
						key = it.next();
						if (!"ID".equals(key) && !"TEXT".equals(key) && !"STATE".equals(key)) {
							if (attributes == null) {
								attributes = new HashMap<String, Object>();
							}
							attributes.put(key, map.get(key));
						}
					}
					if (attributes != null) {
						option.put("attributes", attributes);
					}

					list.add(option);
				}
			} else {
				// 数据字典方式
				return "dragon/modules/system/dic/action/DicHandler/combotree.ejw";
			}
		} else {
			// checkbox 或 radio，单层下拉列表
			// 数据源，同时定义 options 和 sql，优先处理 options
			list = fieldTemplate.getOptionsList();
			if (list == null) {
				list = FieldTemplateDao.getData(parameterMap, fieldTemplate);

				// 缓存
				if (fieldTemplate.getCache() == 1) {
					fieldTemplate.setOptionsList(list);
				}
			}
		}

		JSONObject jsonObject = new JSONObject();
		jsonObject.put("data", list);

		String result = jsonObject.toJSONString();
		result = result.substring(8, result.length() - 1);
		output(result);

		result = null;
		jsonObject = null;

		list = null;
		fieldTemplate = null;
		parameterMap = null;

		return NO_FORWARDING;
	}

}
